ReverseV2
对输入Tensor按指定维度反转。
- 输入:
src - 需反转数据的地址
param - 算子计算所需参数的结构体。其各成员见下述。
core_mask - 核掩码(仅共享存储版本使用)。
ReverseParameter定义:
1typedef struct ReverseParameter {
2 int* axis_flag_; // 用于存储需反转的轴,需反转的轴对应于数组索引的元素被置为1,其余元素为0
3 int* input_shape_; // 输入张量的形状
4 int* input_strides_; // 一个记录输入张量每一维步长的数组
5 int** cur_coord_; // 二维数组,每个元素存储对应核心所使用的cur_coord数组地址,这个数组用于记录当前循环到的元素坐标
6 int ndim_; // 输入和输出张量的维度
7 int axis_ndim_; // 需反转的轴的数目
8 int num_elem_; // 元素总数
9} ReverseParameter;
- 输出:
dst - 输出地址。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128
MT7004 支持fp16, fp32, int16, int32, cplx64
共享存储版本:
-
void i8_reverse_s(int8_t *src, int8_t *dst, ReverseParameter *param, int core_mask)
-
void i16_reverse_s(int16_t *src, int16_t *dst, ReverseParameter *param, int core_mask)
-
void i32_reverse_s(int32_t *src, int32_t *dst, ReverseParameter *param, int core_mask)
-
void hp_reverse_s(float16 *src, float16 *dst, ReverseParameter *param, int core_mask)
-
void fp_reverse_s(float *src, float *dst, ReverseParameter *param, int core_mask)
-
void dp_reverse_s(double *src, double *dst, ReverseParameter *param, int core_mask)
-
void c64_reverse_s(float *src, float *dst, ReverseParameter *param, int core_mask)
-
void c128_reverse_s(double *src, double *dst, ReverseParameter *param, int core_mask)
C调用示例:
1// MT7004 示例(共享存储多核,DDR 地址)
2void Resize(ReverseParameter* param, int* axis) {
3 int i;
4 param->input_strides_[param->ndim_ - 1] = 1;
5 for (i = param->ndim_ - 1; i > 0; i--) {
6 param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i];
7 }
8 for (i = 0; i < param->ndim_; i++) {
9 // initialize axis_flag array by 0
10 param->axis_flag_[i] = 0;
11 }
12 for (i = 0; i < param->axis_ndim_; i++) {
13 param->axis_flag_[axis[i]] = 1;
14 }
15 param->num_elem_ = 1;
16 for (i = 0; i < param->ndim_; i++) {
17 param->num_elem_ *= param->input_shape_[i];
18 }
19}
20
21void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) {
22 int core_num = GetCoreNum(core_mask);
23 int core_id = get_core_id();
24 int logic_core_id = GetLogicCoreId(core_mask, core_id);
25 float* input_data = (float*)0x88000000;
26 float* output_data = (float*)0xA8000000;
27 ReverseParameter* param = (ReverseParameter*)0x84000000;
28 if (logic_core_id == 0) {
29 int i, j;
30 param->axis_ndim_ = axis_ndim;
31 param->ndim_ = ndim;
32 param->input_shape_ = (int*)0x84003000;
33 for (i = 0; i < ndim; i++) {
34 param->input_shape_[i] = shape[i];
35 }
36 param->input_strides_ = (int*)0x84004000;
37 param->axis_flag_ = (int*)0x84005000;
38 param->cur_coord_ = (int**)0x84006000;
39 for (i = 0; i < 4; i++) {
40 param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL);
41 for (j = 0; j < ndim; j++) {
42 param->cur_coord_[i][j] = 0;
43 }
44 }
45 Resize(param, axis);
46 }
47 sys_bar(0, core_num); // 初始化参数完成后进行同步
48 fp_reverse_s(input_data, output_data, param, core_mask);
49}
50
51void main(){
52 int shape[3] = {10, 10, 1000};
53 int ndim = 3;
54 int axis[3] = {0, 1, 2};
55 int axis_ndim = 3;
56 int core_mask = 0b1111;
57 TestReverseV2(shape, ndim, axis, axis_ndim, core_mask);
58}
私有存储版本:
-
void i8_reverse_p(int8_t *src, int8_t *dst, ReverseParameter *param)
-
void i16_reverse_p(int16_t *src, int16_t *dst, ReverseParameter *param)
-
void i32_reverse_p(int32_t *src, int32_t *dst, ReverseParameter *param)
-
void hp_reverse_p(float16 *src, float16 *dst, ReverseParameter *param)
-
void fp_reverse_p(float *src, float *dst, ReverseParameter *param)
-
void dp_reverse_p(double *src, double *dst, ReverseParameter *param)
-
void c64_reverse_p(float *src, float *dst, ReverseParameter *param)
-
void c128_reverse_p(double *src, double *dst, ReverseParameter *param)
C调用示例:
1// MT7004 示例(私有存储单核,AM 地址)
2void TestReverseV2_p(int* shape, int ndim, int* axis, int axis_ndim) {
3 int i, j;
4 float* input_data = (float*)0x10000000;
5 float* output_data = (float*)0x10020000;
6 ReverseParameter* param = (ReverseParameter*)0x10040000;
7
8 param->axis_ndim_ = axis_ndim;
9 param->ndim_ = ndim;
10 param->axis_flag_ = (int*)0x10041000;
11 param->input_shape_ = (int*)0x10041400;
12 param->input_strides_ = (int*)0x10041800;
13 param->cur_coord_ = (int**)0x10041C00;
14 for (i = 0; i < ndim; i++) {
15 param->input_shape_[i] = shape[i];
16 }
17 for (i = 0; i < 4; i++) {
18 param->cur_coord_[i] = (int*)(0x10042000 + i * 0x400LL);
19 for (j = 0; j < ndim; j++) {
20 param->cur_coord_[i][j] = 0;
21 }
22 }
23 Resize(param, axis);
24
25 fp_reverse_p(input_data, output_data, param);
26}
27
28void main(){
29 int shape[3] = {4, 8, 8};
30 int ndim = 3;
31 int axis[3] = {0, 1, 2};
32 int axis_ndim = 3;
33 TestReverseV2_p(shape, ndim, axis, axis_ndim);
34}